import axios from "axios";
import Cookies from "js-cookie";
import { getGlobalBaseUrl } from "@/utils/reset";
import Qs from "qs";

// 请求成功之后，errorCode 报错列表
const errorMap = new Map([
  ["400", "参数不合法"],
  ["401", "未登录，请先登录"],
  ["403", "权限足，不拒绝访问"],
  ["404", "资源不存在"],
  ["500", "服务器内部错误"]
]);
// 请求失败报错列表
const errorStatusMap = new Map([
  [400, "参数不合法"],
  [401, "未授权，请登录"],
  [403, "拒绝访问"],
  [404, "资源不存在"],
  [408, "请求超时"],
  [500, "服务器内部错误"],
  [501, "服务未实现"],
  [502, "网关错误"],
  [503, "服务不可用"],
  [504, "网关超时"],
  [505, "HTTP版本不受支持"]
]);

// 数据组传递对象处理
const formatParamsArray = data => {
  for (const key in data) {
    if (data[key] instanceof Array) {
      let isObj = false;
      data[key].map((item, index) => {
        if (typeof item === "object") {
          isObj = true;
          for (const ikey in item) {
            const k = key + "[" + index + "]." + ikey;
            const v = item[ikey];
            data[k] = v;
          }
        }
      });
      if (isObj) {
        delete data[key];
      }
    }
  }
  return Qs.stringify(data, {
    allowDots: true,
    arrayFormat: "repeat"
  });
};

// create an axios instance
const service = axios.create({
  baseURL: getGlobalBaseUrl(),
  withCredentials: true, // send cookies when cross-domain requests
  timeout: 60000 // request timeout
});

// request interceptor
service.interceptors.request.use(
  config => {
    config.headers.isAjax = true;
    config.transformRequest = (data, headers) => {
      // debugger
      if (data) {
        data = {
          t: Date.parse(new Date()) / 1000,
          ...data
        };
      }
      return formatParamsArray(data);
    };
    config.paramsSerializer = params => {
      if (params) {
        params = {
          t: Date.parse(new Date()) / 1000,
          ...params
        };
      }
      return formatParamsArray(params);
    };
    return config;
  },
  error => {
    return new Error(error);
  }
);

// response interceptor
service.interceptors.response.use(
  response => {
    if (response.status === 200) {
      const data = response.data;
      // 这个状态码是和后端约定的
      const { errorCode } = data;
      // 根据 errorCode 进行判断
      if (errorCode === undefined) {
        // 如果没有 errorCode 代表这不是项目后端开发的接口
        return data;
      }
      if (data.errorCode) {
        const errorMessage = errorMap.get(data.errorCode);
        if (data.errorCode === "0") {
          return data.result;
        } else {
          if (errorMessage) {
            return Promise.reject(errorMessage);
          } else {
            return Promise.reject(data.errorMessage);
          }
        }
      } else {
        return data;
      }
    }
  },
  error => {
    if (error && error.response) {
      error.message = errorStatusMap.get(error.response.status)
        ? errorStatusMap.get(error.response.status)
        : error;
    } else if (error && error.request) {
      if (error.request.readyState === 4 && error.request.status === 0) {
        // 我在这里重新请求
        error.message = "接口响应超时";
      }
    }
    // return Promise.reject(error)
    return new Error(error);
  }
);
export default service;
